# -*-coding:utf-8-*-
import re

from ddparser import DDParser
import pkuseg

'''
LAC默认模型分词 粒度太大 如：我没有钱---> 我没有  钱
换用北大分词工具 pkuseg
分析"有"字句的句法结构
一般情形：“有/没有/还有……”作为HED，SBV或VOB作为修饰
特殊情形：其他动词或形容词作为HED  ”有“作为ADV\VOB修饰HED
其他复杂情形：鲁迅没有那么激昂的笔触很难表达不出那个时代真正的情感……待处理
'''

ddp = DDParser()
pkuseg = pkuseg.pkuseg()

def find_key(sentence):
    # 正则表达式寻找关键字 确定句子中含“有”
    #pattern_1 = re.compile(r'[\u6709]')         # 有
    pattern_1 = re.compile(r'\u662f')
    #pattern_2 = re.compile(r'[\u88ab]')
    if  re.findall(pattern_1, sentence) :
        return sentence
    return ""

def find_hed(text):
    sentences = re.split(r"[。；：，！？]", text)
    for sent in sentences:
        sent = find_key(sent)
        if sent == "":
            continue
        print("*" * 100)
        print(sent)
        pkures = pkuseg.cut(sent)
        ddpres = ddp.parse_seg([pkures])
        print(pkures)
        print(ddpres)

        hed_num = -1    # hed在词表中的位置，从1算起
        for i in range(len(pkures)):
            if ddpres[0]["deprel"][i] == "HED":
                hed_num = i + 1
        hed_info = [{"word": ddpres[0]["word"][hed_num - 1], "num": hed_num, "dep": ddpres[0]["deprel"][hed_num - 1]}]   # HED信息
        sbv_info,vob_info,adv_info = find_hedmodifi(pkures, ddpres, hed_info)
        print(hed_info)
        print(sbv_info)
        print(vob_info)
        print(adv_info)
        judge_type(hed_info, sbv_info, vob_info, adv_info)




def find_hedmodifi(pkures,ddpres,hed_info):
    # 查找是否有修饰HED的SBV和VOB 或  修饰其他-HED的”有“-ADV
    deprel = ddpres[0]['deprel']
    sbv_info = []
    vob_info = []
    adv_info = []
    for i in range(len(pkures)):
        if deprel[i] == 'SBV' and ddpres[0]['head'][i] == hed_info[0]['num']:
            sbv_info.append({'word': ddpres[0]['word'][i],'deprel':ddpres[0]['deprel'][i],'hed_word':hed_info[0]['word']})
        if deprel[i] == 'VOB' and ddpres[0]['head'][i] == hed_info[0]['num']:
            vob_info.append({'word': ddpres[0]['word'][i],'deprel':ddpres[0]['deprel'][i],'hed_word':hed_info[0]['word']})
        if deprel[i] == 'ADV' and find_key(ddpres[0]['word'][i]) and ddpres[0]['head'][i] == hed_info[0]['num']:
            adv_info.append({'word': ddpres[0]['word'][i],'deprel':ddpres[0]['deprel'][i],'hed_word':hed_info[0]['word']})      # “有”作为ADV修饰HED

    return sbv_info,vob_info,adv_info

def judge_type(hed_info,sbv_info,vob_info,adv_info):
    # 第一种情形 “有”作为HED 寻找修饰“有”的SBV或VOB
    if find_key(hed_info[0]['word']) and (sbv_info or vob_info):
        print("此句是“有”字句！")
    # 第二种情形 其他动词或形容词作为HED  寻找作为ADV或VOB的”有“
    elif adv_info or find_key(vob_info[0]['word']):
        print("此句是“有”字句！")
    else:
        print("此句不是“有”字句")

if __name__ == '__main__':
    #text = '家里有老人。我没有问题。这里有一百朵花。电子科大没有十个傻子。他有多可恶。我也没有钱。老师同学都没有死。'
    text = '咱们有枪，不怕他。木莲有莲房一般的果实。树上有两只鸟在叫'       # 主||“有”+宾
    #text = '我没有戒指，我也没有钱，我还没有车，我更没有房，你愿意嫁给我吗？'     # 主||“没” + “有” + 宾
    #text = '今天有二十几度吧。每一个时代都有很多特殊的人，人人都有一双手。我有一表侄，他有三十来岁吧。'     # 主||“有”+数量词组（+形）
    #text = '参加会议的没有那么多人，他没有我大吧'    # 主||“没”+“有”+数量词组（+形）
    #text = '国王有那么多奢靡的珍宝，从不肯分给百姓一些。昨晚没睡好，今早起来有点头晕。鲁迅没有那么激昂的笔触很难表达出那个时代真正的情感。你有去过日本吗？'
    #text = '蔬菜也有，水果也有，他哪有我大呀。上天都有好生之德。涉案人员都没有据实上报孙小果案件的实情。我也没干什么过分的事呀。'        # 主||状[“都/也”]（+“没”）+“有”
    #text = '做任何事都要有恒心。他身体不好，感觉有一段时间了，这些新兵有的是工人，有的是社员。'      # 特殊
    # text = '他没有我大。昨晚没睡好，今早起来有点头晕。鲁迅没有那么激昂的笔触很难表达出那个时代真正的情感。你有去过日本吗？他哪有我大呀！他身体不好，感觉有一段时间了。孙小果有多么可恶。'    # 特殊
    text = '今天是没赶上第一班车'
    find_hed(text)
